package com.bbva.kyfb.kyfbofo.abstracts;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.bbva.kyfb.kyfbdaofo.interfaces.SfoDao;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdtofo.RequestDto;
import com.bbva.kyfb.kyfbdtofo.ResponseDto;
import com.bbva.kyfb.kyfbdtofo.entitys.SfoDTO;
import com.bbva.kyfb.kyfbdtofo.firmas.errores.Errores_kyfbfo_servicios;
import com.bbva.kyfb.kyfbjpatlbh.dominiotlbh.TtlsbsfoPK;
import com.bbva.kyfb.kyfbofo.interfaces.ExecuteBO;
import com.bbva.kyfb.kyfbutils.constantes.ConstantesFO;

public abstract class ExecuteBOAbstract implements ExecuteBO {

	@Autowired
	protected ResponseDto responseDto;	
	
	@Autowired
	protected SfoDao sfoDao;
	
	@Autowired
	private SfoDTO sfoDTO;

	@Override
	public ResponseDto execute(RequestDto aRequestDto) {
		if (filter(aRequestDto)) {
			responseDto = process(aRequestDto);
		}
		
		return responseDto;
	}

	protected boolean filter(RequestDto aRequestDto) {
		TtlsbsfoPK ttlsbsfoPK = SfoDTO.parseFicheroRequestToTtlsbsfoPK(aRequestDto);
		List<SfoDTO> ttlsbsfoDTOList = sfoDao.selectSFOandCAFfromSFOandCABbySFOpk(ttlsbsfoPK);
		
		if(ttlsbsfoDTOList.size()==1) {
			SfoDTO ttlsbsfoDTO = ttlsbsfoDTOList.get(0);			
			if(ConstantesFO.ESTADO_SFO.equalsIgnoreCase(ttlsbsfoDTO.getCodEstadods()) &&
			ConstantesFO.ESTADO_CAB.equalsIgnoreCase(ttlsbsfoDTO.getCodEstacash())) {				
				setSfoDTO(ttlsbsfoDTO);
				return true;
			}
			
			getResponseDto().setError(Errores_kyfbfo_servicios.ERROR_PARAMETROS_DE_PETICION_NO_PERMITIDOS);
			getResponseDto().setAssistantDescError(ConstantesFO.ERROR_PARAMETROS_DE_PETICION_NO_PERMITIDOS);

		}
		
		getResponseDto().setError(Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
		
		getResponseDto().setAssistantDescError(ConstantesFO.NO_EXISTEN_DATOS_A_LISTAR);
		getResponseDto().setAssistantCodError(ConstantesFO.COD_ERROR);
		
		return false;
	}

	protected abstract ResponseDto process(RequestDto aRequestDto);
	
	public ResponseDto getResponseDto() {
		return responseDto;
	}

	public void setResponseDto(ResponseDto responseDto) {
		this.responseDto = responseDto;
	}
	
	protected SfoDTO getSfoDTO() {
		return sfoDTO;
	}

	protected void setSfoDTO(SfoDTO sfoDTO) {
		this.sfoDTO = sfoDTO;
	}
}
